#===================================== LINGUAGEM C ===========================================================

#/* Este programa realiza a soma de uma Progressão Geométrica com 10 elementos, elemento inicial a e razão q.
#
#  Autor: Osvaldo Luciano dos Santos - Atividade apresentada na disciplina Arquitetura de Computadores.
#   
#  Fevereiro de 2013 - São Carlos - SP - UAB/UFSCar - BSI - Grupo 5*/

# #include <stdio.h>
# #include <stdlib.h>

#int main (int argc, char *argv[]){
    
#    int numero[10], soma, razao, i; // Declaração de variáveis
    
#    // Leitura do elemento inicial e da razão da PG

#    printf("Entre com o valor do elemento inicial da PG\n\n");
#    scanf("%d", &numero[i]);
#    printf("Entre com o valor da razao da PG\n\n");
#    scanf("%d", &razao);
    
#    soma = 0; // Inicialização da variável soma
    
#    // Laço para execução da soma dos 10 elementos da PG

#    for (i=0; i<10; i++){
#        soma = soma + numero[i];
#        numero[i+1] = numero[i]*razao;
#        }
    
#    // Impressão do resultado na tela

#    printf("Valor da soma dos 10 elementos da PG: %d\n\n", soma);

#    // Fim do programa
#    system("pause");
    
#    return(0);
#}

#====================================== ASSEMBLY ============================================================

#  Este programa realiza a soma de uma Progressão Geométrica com 10 elementos, elemento inicial a e razão q.
#
#  Autor: Osvaldo Luciano dos Santos - Atividade apresentada na disciplina Arquitetura de Computadores.
#   
#  Fevereiro de 2013 - São Carlos - SP - UAB/UFSCar - BSI - Grupo 5

# IMPORTANTE: entendendo que estamos num simulador para rodar este programa - e como não compreendo muito
# bem como trabalharíamos com entrada de dados do teclado para o usuário definir a PG de seu interesse - 
# vamos fazer algumas adaptações como:
# 1) definir o elemento inicial como valor 1;
# 2) definir a razão como valor 2;
# Desta forma esperamos como resultado a soma dos elementos 1, 2, 4, 8, 16, 32, 64, 128, 256 e 512, que será
# igual a 1023.

# Início do Programa:

# Secao de declaracao de variaveis globais
	.data			# secao de dados

info:	.ascii	"\nEste programa, exemplo, calcula a soma da PG de 10 elementos,\n\n"
	.asciiz  "de valor inicial 1 e razao igual a 2, imprimindo o valor na tela.\n\n"	# asciiz termina com \0 (NULL)
 	
vetor:	.space 40		# reserva espaço de memória para cada elemento da PG (4 bytes x 10 elementos)

# Parte principal do programa
	.text 
main:	
	# Mostra informações no cabeçalho
	la	$a0, info	# Endereco do que deve ser mostrado na tela (Strigs carregadas no argumento $a0)
	li	$v0, 4		# syscall para imprimir string que foi carregada no argumento $a0 (4 é o coigo específico)
	syscall			# Emissão da instrução syscall

	# Inicializa valores
				# Escolha do registrador temporário $t0 para a variável soma
	li	$t0, 0		# Zera soma

				# Escolha do registrador temporário $t1 para a variável numero[i]
	li	$t1, 1		# Atribui valor 1 ao elemento inicial da PG
				# Na linguagem em C este valor estava sendo lido do teclado

				# Escolha do registrador temporário $t2 para a variável razao
	li	$t2, 2		# Atribui valor 2 à razão da PG
				# Na linguagem em C este valor estava sendo lido do teclado

				# Escolha do registrador temporário $t3 para ser o contador				
	li	$t3, 10		# Inicializa contador do loop soma (10 é o número de elementos)
	
	li	$t4, 0		# inicializa contador para o vetor (registro na memória)
	
	sw 	$t1, vetor($0)	# registra 1 na posição 0 do vetor

soma:				# Loop para encontrar a soma
	add	$t0, $t0, $t1	# Em C:  soma = soma + numero[i]
	
	mult    $t1, $t2	# Em C:  numero[i+1] = numero[i]*razao; neste caso ficaria mais fácil
				# se visualizássemos numero[i] = numero[i]*2
	
	mflo	$t1		# O produto entre $t1 e $t2 é carregado no registro lo
				# mflo move o resultado gravado em lo para $t1
	
	addi	$t4, $t4, 4	# registro dos elementos da PG na memória
	sw	$t1, vetor($t4)	#
				
	addi	$t3, $t3, -1	# Decrementa o contador
	
	bgtz	$t3, soma 	# Em C marcamos a parada ao contrário (enquanto menor que 10)
				# Neste caso: if ($t2 > 0) salta para o label soma

	# mostra resultado
	move	$a0, $t0	# Grava resultado soma, em $t0, no $a0 para impressao (exigência da instrução syscall)
	li	$v0, 1		# syscall para imprimir inteiro (1 é o código específico)
	syscall			# Emissão da instrução syscall

	# terminamos
	li	$v0, 10	 	# syscall para terminar o programa (10 é o código específico)
	syscall			# Emissão da instrução syscall
	
	
	# Sugestão: como seria se quiséssemos gravar os elementos da PG na memória?
   
  # teste para controle de versão!
	
